package cn.easyutil.project.base.service;

import java.util.List;
import java.util.Map;
import java.util.Set;

/** 缓存服务 */
public interface CacheService {
	/**
	 * 存储val
	 * 
	 * @param key
	 * @param val
	 */
	public void set(String key, String val);

	/**
	 * 设置过期时间
	 * 
	 * @param key
	 * @param val
	 * @param countdownOfSecond
	 *            过期倒计时时间(秒)
	 */
	public void set(String key, int countdownOfSecond);

	/**
	 * 设置过期时间
	 * 
	 * @param key
	 * @param val
	 * @param expireTime
	 *            具体到期时间(时间戳)
	 */
	public void set(String key, long expireTime);

	/**
	 * 存放key val
	 * 
	 * @param key
	 * @param val
	 * @param countdownOfSecond
	 *            过期倒计时时间(秒)
	 */
	public void set(String key, String val, int countdownOfSecond);

	/**
	 * 存放key val
	 * 
	 * @param key
	 * @param val
	 * @param expireTime
	 *            具体到期时间(时间戳)
	 */
	public void set(String key, String val, long expireTime);


	/**
	 * 获取key对应的val
	 * 
	 * @param key
	 * @return
	 */
	public String get(String key);

	/**
	 * 获取所有redis数据
	 * 
	 * @param key
	 * @return
	 */
	public Map<String, Object> getAll();

	/**
	 * 获取key对应的val
	 * 
	 * @param key
	 * @return
	 */
	public List<String> get(String[] keys);

	/**
	 * 放置对象
	 * 
	 * @param key
	 * @param obj
	 * @param expTime
	 *            具体的过期时间(毫秒)
	 */
	public <T> void setObj(String key, T obj, long expTime);

	/**
	 * 放置对象
	 * 
	 * @param key
	 * @param obj
	 * @param countdownOfSecond
	 *            过期倒计时时间(秒)
	 */
	public <T> void setObj(String key, T obj, int countdownOfSecond);

	/**
	 * 放置对象
	 * 
	 * @param key
	 * @param obj
	 */
	public <T> void setObj(String key, T obj);

	/**
	 * 获取key对应的对象
	 * 
	 * @param key
	 * @param clazz
	 * @return
	 */
	public <T> T getObj(String key, Class<T> clazz);

	/**
	 * 放置集合数据
	 * 
	 * @param key
	 * @param list
	 *            数组
	 */
	public void setArray(String key, String... array);

	/**
	 * 放置集合数据
	 * 
	 * @param key
	 * @param list
	 *            数组
	 * @param index
	 *            数组下标
	 * @param val
	 *            要设置的值
	 */
	public void setArray(String key, long index, String val);

	/**
	 * 获取集合数据
	 * 
	 * @param key
	 * @param start
	 *            key对应的集合索引起始位置
	 * @param end
	 *            key对应的集合索引结束位置
	 * @return
	 */
	public List<String> getArray(String key, Long start, Long end);

	/**
	 * 获取集合数据
	 * 
	 * @param key
	 * @return key对应的集合val
	 */
	public List<String> getArray(String key);

	/**
	 * 获取集合数据
	 * 
	 * @param key
	 * @param index
	 *            下表索引
	 * @return 下标对应的val
	 */
	public String getArray(String key, Long index);

	/**
	 * 获取集合长度
	 * @param key
	 * @return
	 */
	public Long getArraySize(String key);

	/**
	 * 从数组右侧删除一位，并返回删除的值
	 * @param key
	 * @return
	 */
	public String removeArrayRight(String key);
	
	/**
	 * 从数组左侧删除一位，并返回删除的值
	 * @param key
	 * @return
	 */
	public String removeArrayLeft(String key);
	
	/**
	 * 删除集合中所有符合条件的元素
	 * @param key
	 * @param val
	 */
	public void removeArrayVal(String key, String val);
	/**
	 * 设置map
	 * 
	 * @param key
	 * @param map
	 */
	public void setMap(String key, Map<String, String> map);

	/**
	 * 设置map
	 * 
	 * @param key
	 * @param field
	 * @param val
	 */
	public void setMap(String key, String field, String val);

	/**
	 * 获取map数据
	 * 
	 * @param key
	 */
	public Map<String, String> getMap(String key);

	/**
	 * 获取map结构数据
	 * 
	 * @param key
	 * @param field
	 *            map数据中的key
	 * @return
	 */
	public String getMap(String key, String field);

	/**
	 * 获取指定map中的所有key
	 * 
	 * @param key
	 * @return
	 */
	public Set<String> getMapKeys(String key);

	/**
	 * 获取指定map中的所有val
	 * 
	 * @param key
	 * @return
	 */
	public List<String> getMapVals(String key);

	/**
	 * 获取map数据长度
	 * 
	 * @param key
	 */
	public Long getMapSize(String key);

	/**
	 * 原子自增或自减
	 * 
	 * @param key
	 * @param num
	 *            正数或负数
	 */
	public void incr(String key, Number num);

	/**
	 * 对key做+1
	 * 
	 * @param key
	 */
	public void incr(String key);

	/**
	 * 是否存在key
	 * 
	 * @param key
	 * @return
	 */
	public boolean isExists(String key);

	/**
	 * 取消过期时间
	 * 
	 * @param key
	 * @return
	 */
	public void delExpireTime(String key);
	
	/**
	 * 获取key的过期时间
	 * @param key
	 */
	public Long getExpireTime(String key);

	/**
	 * 删除key
	 * 
	 * @param keys
	 */
	public void delete(String... keys);

	/**
	 * 加锁
	 * 
	 * @param key
	 *            锁标记
	 * @return
	 */
	public boolean lock(String key);

	/**
	 * 加锁
	 * 
	 * @param key
	 *            锁标记
	 * @param holdTime
	 *            锁的最大使用时间
	 * @return
	 */
	public boolean lock(String key, long holdTime);

	/**
	 * 加锁
	 * 
	 * @param key
	 *            锁标记
	 * @param flag
	 *            锁持有人标记
	 * @param holdTime
	 *            锁的最大使用时间
	 * @return
	 */
	public boolean lock(String key, String flag, long holdTime);

	/**
	 * 解锁
	 * 
	 * @param key
	 *            锁标记
	 * @param flag
	 *            加锁者标记
	 */
	public boolean unlock(String key, String flag);

	/**
	 * 解锁
	 * 
	 * @param flag
	 *            锁标记
	 */
	public boolean unlock(String key);


	/**
	 * 清空数据
	 */
	public void deleteAll();

}
